package Classes;

import java.util.ArrayList;

import junit.framework.Assert;

import org.junit.Before;
import org.junit.Test;


public class TestaUsuario {
        Usuario usuario1;
        Usuario usuario2;
        Usuario usuario3;
        Usuario usuario4;
        Usuario usuario5;
        Estabelecimento restaurante1,restaurante2,restaurante3,restaurante4,restaurante5;
        
        @Before
        public void criaUsuarios() throws Exception{
                usuario1 = new Usuario("Guilherme", "30/03/2011", null);
                usuario2 = new Usuario("Danilo", "01/01/2011", null);

                restaurante1 = new Estabelecimento("Bonaparte", "Av.beberibe","a la carte");
                restaurante2 = new Estabelecimento("Chinatown", "Rua Princesa","Petisco");
                restaurante3 = new Estabelecimento("Bar do George", "Av.Boa Viagem","a la carte");
        }
        
        @Test
        public void testaGetNome(){
                Assert.assertEquals("Guilherme", usuario1.getNome());
                Assert.assertEquals("Danilo", usuario2.getNome());
        }
        
        @Test
        public void testaGetDataDoCadastro(){
                Assert.assertEquals("30/03/2011", usuario1.getDataDoCadastro());
                Assert.assertEquals("01/01/2011", usuario2.getDataDoCadastro());
        }
        
        @Test
        public void testaConstrutor(){

                try {
                        usuario3 = new Usuario("", "30/03/2011", null);
                } catch (Exception e) {
                        Assert.assertEquals("Parametro nome invalido.", e.getMessage());
                }
                
                try {
                        usuario3 = new Usuario("Nazareno", "30/03/2011", null);
                } catch (Exception e) {
                        Assert.assertEquals("Parametro nome invalido.", e.getMessage());
                }
                
        }
        
        @Test
        public void testaAdicionaPreferencia() throws Exception{
        	ArrayList<Opniao> opinioes = new ArrayList<Opniao>();
        	ArrayList<Opniao> opinioes2 = new ArrayList<Opniao>();
        	
        	usuario1 = new Usuario("Guilherme", "30/03/2011", opinioes);
        	usuario4 = new Usuario("Thiago", "30/03/2011", opinioes2);
                
            Assert.assertTrue(usuario1.getPreferencias().isEmpty());
            Assert.assertTrue(usuario4.getPreferencias().isEmpty());
            
            Assert.assertTrue(usuario1.adicionaPreferencia(new Opniao(restaurante1, 4, "Muito bom")));
            Assert.assertTrue(usuario4.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
            Assert.assertFalse(usuario4.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
            Assert.assertTrue(usuario4.adicionaPreferencia(new Opniao(restaurante3, 4, "Muito bom")));
            
            Assert.assertEquals(1, usuario1.getPreferencias().size());
            Assert.assertEquals(2, usuario4.getPreferencias().size());
        }

        @Test
        public void testaGetPreferencias() throws Exception{
        	ArrayList<Opniao> opinioes = new ArrayList<Opniao>();
        	ArrayList<Opniao> opinioes2 = new ArrayList<Opniao>();
        	
        	usuario1 = new Usuario("Guilherme", "30/03/2011", opinioes);
        	usuario2 = new Usuario("Thiago", "20/02/2011", opinioes2);
        	
          	ArrayList<Opniao> opinioes3 = new ArrayList<Opniao>();
        	ArrayList<Opniao> opinioes4 = new ArrayList<Opniao>();
        	
        	usuario3 = new Usuario("Danilo", "01/01/2011", opinioes3);
        	usuario4 = new Usuario("Nazareno", "30/03/2011", opinioes4);
        	
        	Assert.assertTrue(usuario1.adicionaPreferencia(new Opniao(restaurante1, 4, "Muito bom")));
            Assert.assertTrue(usuario2.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
            Assert.assertTrue(usuario2.adicionaPreferencia(new Opniao(restaurante3, 4, "Muito bom")));

            Assert.assertTrue(usuario3.adicionaPreferencia(new Opniao(restaurante1, 4, "Muito bom")));
            Assert.assertTrue(usuario4.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
            Assert.assertTrue(usuario4.adicionaPreferencia(new Opniao(restaurante3, 4, "Muito bom")));

            Assert.assertEquals(usuario1.getPreferencias(), usuario3.getPreferencias());
            Assert.assertEquals(usuario2.getPreferencias(), usuario4.getPreferencias());
        }
        
        @Test
        public void testaGetOpniao() throws Exception{
        	ArrayList<Opniao> opinioes2 = new ArrayList<Opniao>();
        	
        	usuario2 = new Usuario("Thiago", "20/02/2011", opinioes2);

        	Opniao opniao1 = new Opniao(restaurante2, 3, "Bastante Bom");
            Opniao opniao2 = new Opniao(restaurante3, 4, "Muito bom");
            
            Assert.assertTrue(usuario2.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
            Assert.assertTrue(usuario2.adicionaPreferencia(new Opniao(restaurante3, 4, "Muito bom")));
            
            Assert.assertEquals(opniao1, usuario2.getOpniao("Chinatown"));
            Assert.assertEquals(opniao2, usuario2.getOpniao("Bar do George"));
        }
        
        @Test
        public void testaGetOpniaoBoolean() throws Exception{
        	ArrayList<Opniao> opinioes2 = new ArrayList<Opniao>();
        	
        	usuario2 = new Usuario("Thiago", "20/02/2011", opinioes2);

            Assert.assertTrue(usuario2.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
            Assert.assertTrue(usuario2.adicionaPreferencia(new Opniao(restaurante3, 4, "Muito bom")));
            
            Assert.assertTrue(usuario2.getOpniaoBoolean("Chinatown"));
            Assert.assertTrue(usuario2.getOpniaoBoolean("Bar do George"));
        }
        
        @Test
        public void testaMudaPreferencia() throws Exception{
        		ArrayList<Opniao> opinioes2 = new ArrayList<Opniao>();
                usuario4 = new Usuario("Nazareno", "30/03/2011", opinioes2);
                
                Opniao opniao1 = new Opniao(restaurante2, 5, "Incrivel, sensacional, impressionante");
                Opniao opniao2 = new Opniao(restaurante3, 2, "bonzinho");
                
                Assert.assertTrue(usuario4.adicionaPreferencia(new Opniao(restaurante2, 3, "Bastante Bom")));
                Assert.assertTrue(usuario4.adicionaPreferencia(new Opniao(restaurante3, 4, "Muito bom")));
                
                Assert.assertTrue(usuario4.mudaPreferencia(opniao1));
                Assert.assertTrue(usuario4.mudaPreferencia(opniao2));
                
                Assert.assertEquals(opniao1, usuario4.getOpniao("Chinatown"));
                Assert.assertEquals(opniao2, usuario4.getOpniao("Bar do George"));
                
        }
        
        @Test
        public void testaRemovePreferencia() throws Exception{
    		ArrayList<Opniao> opinioes2 = new ArrayList<Opniao>();
            usuario5 = new Usuario("Nazareno", "30/03/2011", opinioes2);
    
            Opniao opniao1 = new Opniao(restaurante2, 3, "Bastante Bom");
            Opniao opniao2 = new Opniao(restaurante3, 4, "Muito bom");
            
            Assert.assertTrue(usuario5.adicionaPreferencia(opniao1));
            Assert.assertTrue(usuario5.adicionaPreferencia(opniao2));
    
            Assert.assertEquals(opniao1, usuario5.getOpniao("Chinatown"));
            Assert.assertEquals(opniao2, usuario5.getOpniao("Bar do George"));
            
            Assert.assertEquals(2, usuario5.getPreferencias().size());
            usuario5.removePreferencia("Chinatown");
            Assert.assertEquals(1, usuario5.getPreferencias().size());

        }
        
        
        
        
}